<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var nums = [0, 1, 0, 3, 12];
        // 1.必须在原数组修改,不能拷贝额外的数据
        // 2.尽量减少操作次数
        var j = 0;
        // 将非零元素移动到自己的位置
        // j 表示 第几个非0元素
        for (var i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[j] = nums[i];
                if (i != j) {
                    // 说明i之前是0,所以j没有跟着增长
                    // 把前边的0 移到i的位置
                    nums[i] = 0;
                }
                j++
            }
        }
        console.log(nums);

        var idx = 0; // 非0元素要来到的位置

        // 如果一直没有遇到0  i和  idx 增长是同步的 

        // 遇到0 那么idx不会增加,,会导致 i 和 idx 一直不同步
        // 遇到的不是0的数字,都会逐步的 随着 idx 的增加放到指定的位置
        // 该位置原本的 0  被设置到 当前循环遍历的位置
        for (let i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[idx] = nums[i];
                if (idx != i) {
                    nums[i] = 0;
                }
                idx++;
            }
        }


        // 以下方式 同理,但可能更好理解一点 

        var insertPos = 0;
        // 遍历,将非0元素逐步添加到数组前边
        for (let i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[insertPos++] = nums[i]
            }
        }
        // 遍历结束,只剩下当初的 0元素 没有加入数组
        while (insertPos < nums.length) {
            nums[insertPos++] = 0;
        }


        // 更好的思路 ,跟思路1 一样,
        // 遇到 0 之后,基本思路就一样了,
        // 遇到 0 之前,思路1有 无意义的赋值
        // 该方法 遇到0 之前,没有任何操作数组的动作 

        var snowBallSize = 0;
        // 记录 遇到0 的个数
        for (let i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                snowBallSize++;
            } else if (snowBallSize > 0) {
                // 交换位置 
                // var t = nums[i];
                // nums[i] = 0;
                // nums[i - snowBallSize] = t;

                // 因为永远是和0 交换 
                // 思路一 就是如此
                nums[i - snowBallSize] = nums[i];
                nums[i] = 0;
            }

        }

    </script>
</body>

</html>